package com.aaa.product.task;


import com.aaa.product.entity.SeckillStatus;
import com.aaa.product.entity.TbActProduct;
import com.aaa.product.entity.TbOrdInf;
import com.aaa.product.service.impl.TbOrdInfServiceImpl;
import com.aaa.product.util.DateUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

@Component
public class MultiThreadingCreateOrder {
    @Resource
    TbOrdInfServiceImpl tbOrdInfServiceImpl;
    @Resource
    RedisTemplate redisTemplate;

//    /**
//     * 多线程执行
//     */
//    @Async
//    public Future<Object> createOrder(TbOrdInf tbOrdInf){
//        JSONObject jsonObject = new JSONObject();
//        try {
//            Date date = new Date();
//            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            String dateString = formatter.format(date);
//            tbOrdInf.setUpdateDate(dateString);
//
//            List<Date> dateMenus = DateUtil.getDateMenus();
//            for (Date dateMenu : dateMenus) {
//                //  时间的字符串  yyyyMMddHH
////                String timespace = "product_"+ DateUtil.data2str(dateMenu,"yyyyMMddHH");
//                String timespace = "product";
//                System.out.println("现在的时间");
//                System.out.println(timespace);
//                String tid = tbOrdInf.getTid();
//                System.out.println("商品的id ");
//                System.out.println(tid);
//                TbActProduct tbActProduct = (TbActProduct) redisTemplate.boundHashOps(timespace).get(tbOrdInf.getTid());
//                System.out.println("获取秒杀商品信息");
//                System.out.println(tbActProduct);
//
//                if(tbActProduct == null ||  tbActProduct.getNewStore() == 0){
//                    jsonObject.put("code",3);
//                    jsonObject.put("msg","该商品已售罄");
//                    System.out.println("code+ 3");
//                    return new AsyncResult<Object>(jsonObject);
//                }
//                TbOrdInf tbOrdInfs = (TbOrdInf) redisTemplate.boundHashOps("SeckillOrder").get(tbOrdInf.getTid()+tbOrdInf.getAccountId());
//                // 如果当前用户下的订单超出商品购买的数量
//                if(null != tbOrdInfs){
//                    jsonObject.put("code",2);
//                    jsonObject.put("msg","该商品只能购买1次");
//                    System.out.println("code + 2");
//                    return new AsyncResult<Object>(jsonObject);
//                }
//                // 将订单存储到 redis中
//                redisTemplate.boundHashOps("SeckillOrder").put(tbOrdInf.getTid()+tbOrdInf.getAccountId(),tbOrdInf);
//                // 库存递减
//                tbActProduct.setNewStore(tbActProduct.getNewStore()-1);
//                System.out.println("库存剩下：》》》"+tbActProduct.getNewStore());
//                // 如果商品的库存少于 0
//                if(tbActProduct.getNewStore() <=0 ){
//                    // 同步数据到mysql
//                    // 删除 redis 中的 数据
//                    System.out.println("删除已经上传的商品");
//                    System.out.println("命名空间");
//                    System.out.println(timespace);
//                    System.out.println("商品的id");
//                    System.out.println(tbActProduct.getPid());
//                    //redisTemplate.boundHashOps(timespace).delete(tbActProduct.getPid());
//                    tbActProduct.setNewStore(0);
//                    redisTemplate.boundHashOps(timespace).put(tbActProduct.getPid(),tbActProduct);
//
//                }else{
//                    // 同步数据到 redis
//                    redisTemplate.boundHashOps(timespace).put(tbActProduct.getPid(),tbActProduct);
//                }
//                boolean b = tbOrdInfServiceImpl.saveOrUpdate(tbOrdInf);
//                System.out.println("数据库是否修改成功");
//                System.out.println(b);
//                String oid = "";
//                if (b){
//                    oid = tbOrdInf.getOid();
//                    jsonObject.put("code",1);
//                    jsonObject.put("msg",oid);
//                    System.out.println("if"+jsonObject);
//                    System.out.println("下单完成");
//                    return new AsyncResult<Object>(jsonObject);
//                }
//                jsonObject.put("code",0);
//                jsonObject.put("msg","订单添加失败");
//                System.out.println("else"+jsonObject);
//                System.out.println("出if else 了"+jsonObject);
//            }
//
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return new AsyncResult<Object>(jsonObject);
//    }
    /**
     * 多线程执行
     */
    @Async
    public void createOrder(){
        try {

            // 从 redis 中 获取 用户排队信息
            SeckillStatus seckillStatus = (SeckillStatus) redisTemplate.boundListOps("SeckillOrderQueue").rightPop();
            if(seckillStatus == null){
                return;
            }
            TbOrdInf tbOrdInf = new TbOrdInf();
            // 获取订单信息
            tbOrdInf = seckillStatus.getTbOrdInf();
            //  获取商品 id
            String tid = tbOrdInf.getTid();
            // 获取用户名称
            String username = tbOrdInf.getAccountId();
            // 命名空间
            String timespace = "product";
            // 订单 id
            String oid = "";
            // 先到队列中取出商品信息 SeckillProductQueue_ID,如果能取出，则可以下单
            Object otid = redisTemplate.boundListOps("SeckillProductQueue_" + seckillStatus.getTid()).rightPop();
            // 如果没有，取消排队信息
            if(otid == null){
                clearUserQueue(seckillStatus.getUsername());
                return;
            }

            // 秒杀状态     1.排队中 2.秒杀等待支付（已下单） 3.支付超时  4.秒杀失败  5.支付完成。
            Integer status = seckillStatus.getStatus();
            Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = formatter.format(date);
            tbOrdInf.setUpdateDate(dateString);
            // 获取秒杀商品信息
            TbActProduct tbActProduct = (TbActProduct) redisTemplate.boundHashOps(timespace).get(tid);
            seckillStatus.setMsg("成功下单");
            if(tbActProduct == null ||  tbActProduct.getNewStore() == 0){
                seckillStatus.setMsg("商品已经售罄");
                System.out.println("商品已经售罄的if");
            }else{
                System.out.println("商品已经售罄 else");
                //  从 redis 获取订单 ，商品id 和 用户名
                TbOrdInf tbOrdInfs = (TbOrdInf) redisTemplate.boundHashOps("UserOrder").get(tid+username);
                if(null != tbOrdInfs){
                    seckillStatus.setMsg("该商品有未付款的订单");
                    System.out.println("该商品有未付款的订单if");
                }else{
                    System.out.println("该商品只能购买1次 else");
                    // 将订单存储到 redis中
                    redisTemplate.boundHashOps("UserOrder").put(tbOrdInf.getTid()+tbOrdInf.getAccountId(),tbOrdInf);
                    // 库存递减
                    if(tbActProduct.getNewStore() != 0){
                        boolean b = tbOrdInfServiceImpl.saveOrUpdate(tbOrdInf);
                        if (b){
                            System.out.println("添加订单 0 if");
                            oid = tbOrdInf.getOid();
                            seckillStatus.setOid(oid);
                            // 下单完成修改订单状态
                            seckillStatus.setStatus(2); // 待付款
                            seckillStatus.setMsg("成功下单");
                        }else{
                            System.out.println("添加订单 0 else");
                            seckillStatus.setMsg("下单失败");
                        }
                    }
                    tbActProduct.setNewStore(tbActProduct.getNewStore()-1);
                    System.out.println("库存剩下的数量"+tbActProduct.getNewStore());
//                    Thread.sleep(10000);
                    System.out.println(Thread.currentThread().getId() + "操作后剩下的库存=" + tbActProduct.getNewStore());
                    Long size = redisTemplate.boundListOps("SeckillProductQueue_" + seckillStatus.getTid()).size();
                    // 如果商品的库存少于 0
//                    if(tbActProduct.getNewStore() <=0 ){
                    if(size <=0 ){
                        System.out.println("该商品的库存少于 0 if");
                        //redisTemplate.boundHashOps(timespace).delete(tbActProduct.getPid());
                        tbActProduct.setNewStore(size.intValue());
                        redisTemplate.boundHashOps(timespace).put(tbActProduct.getPid(),tbActProduct);
                    }else{
                        System.out.println("该商品的库存少于 0 else");
                        // 同步数据到 redis
                        redisTemplate.boundHashOps(timespace).put(tbActProduct.getPid(),tbActProduct);
                    }
                }
            }
            System.out.println("商品已经售罄的else");
            System.out.println("结束");
            redisTemplate.boundHashOps("UserQueueStatus").put(tbOrdInf.getAccountId(),seckillStatus);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 清理用户排队抢单
     */
    public void clearUserQueue(String username){
        // 清楚排队标识
//        redisTemplate.boundHashOps("UserQueueCount").delete(username);
        // 清除排队信息
        redisTemplate.boundHashOps("UserQueueStatus").delete(username);
    }
}
